#include <iostream>
#include <cstdio>
#include <cstring>
#include <ctime>

// 使用Linux系统IO中的open函数，需要以下三个文件
#include <sys/types.h> // 使用过程中需要的宏定义
#include <sys/stat.h> // 使用过程中需要的宏定义
#include <fcntl.h> // 函数声明在这里

// 使用Linux系统IO中的close，read，write，等函数，需要以下头文件
#include <unistd.h>

// open、read、close文件夹需要的头文件
#include <dirent.h>

using namespace std;

int main(int argc, char* argv[]) {
    const char dir_path[] = "/home/shiyuxin/CPPServer/01_MakeFileTurtoial";

    DIR* dir = opendir(dir_path);

    if (dir == nullptr) {
        cout << "Error Opening " << dir_path << endl;
        cout << "errno = " << errno << endl;
        perror(dir_path);
    }

    while (true) {
        dirent* item = readdir(dir);

        if (item == nullptr && errno != 0) {
            cout << "Error Reading Directory " << dir_path << "errno = " << errno << endl;
            perror(dir_path);
            break;
        }

        if (item == nullptr && errno == 0) {
            cout << "Done Reading " << dir_path << endl;
            break;
        }

        cout << dir_path << "/" << item->d_name << endl;
        switch (item->d_type) {
            case DT_BLK:
                cout << "是一个块设备" << endl;
                break;
            case DT_CHR:
                cout << "是一个字符设备" << endl;
                break;
            case DT_DIR:
                cout << "是一个目录" << endl;
                break;
            case DT_LNK:
                cout << "是一个链接文件" << endl;
                break;
            case DT_FIFO:
                cout << "是一个管道" << endl;
                break;
            case DT_REG:
                cout << "是一个普通文件" << endl;
                break;
            case DT_SOCK:
                cout << "是一个套接字文件" << endl;
                break;
            case DT_UNKNOWN:
                cout << "未知的文件类型" << endl;
                break;
        }
        cout << endl;
    }
    

    if (closedir(dir) == -1) {
        cout << "Error Closing " << dir_path << endl;
        cout << "errno = " << errno << endl;
        perror(dir_path);
    }
}
